#include <iostream>
#include "GraphNonOrientedMatrix.h"

using namespace std;


GraphNonOriented::GraphNonOriented(summit_t n, edges_t m):Graph(n,m)
{
  // La matrice de voisinage est un tableau de pointeurs vers des tableaux, afin d'avoir accès avec neighbours[i][j]
  // Comme pas de valuation, un booléen suffit
  // On peut supposer qu'on met la connection entre un voisin et lui meme a false, ce qui evite de rajouter des voisins inutiles dans la liste des voisins
  neighbours = new bool*[n]; 
  for(int i(0);i<n;i++)
    {
      neighbours[i]= new bool[n];
      for(int j(0);j<n;j++)
	{
	  neighbours[i][j] = false;
	}
    }
  summit_nb = n;
  edges_nb = m;
}

GraphNonOriented::~GraphNonOriented()
{
  // Allocation dynamique
  std::cout << "Suppression de la matrice de voisins " << endl; 
  for(int i = 0; i < summit_nb; i++) {
    delete [] neighbours[i];
  }
  delete [] neighbours;
}

bool GraphNonOriented::areConnected(summit_t i, summit_t j) const
{
  return (neighbours[i][j]==true)?true:false;
}

void GraphNonOriented::setConnection(summit_t i, summit_t j)
{
  // Symétrie dans le graphe non orienté
  if(i!=j)
    {
      neighbours[i][j]=true;
      neighbours[j][i]=true;
    }
}


vector<summit_t> * GraphNonOriented::getNeighbours(summit_t v) const
{
  // Le premier sommet est le N° 0, par convention

  vector<summit_t>  *v_neighbours= new vector<summit_t>();
  for(int i(0);i<summit_nb;i++)
    {
      if(neighbours[v][i]==true)
	v_neighbours->push_back((summit_t)i);
    }

  // Pas de graphe non connexe ? 
  // Dans ce cas, v_neighbours toujours != vide 
  return v_neighbours;

}

void GraphNonOriented::printGraph()const
{
  cout << "C'est un graphe non orienté non valué " <<endl;
  for(int i(0);i<summit_nb;i++)
    {
      for(int j(0);j<summit_nb;j++)
	{
	  cout << " | " << neighbours[i][j];
	}
      std::cout << " |"<< endl;
    }
}
 
